Revert "a11y: Remove AtkSelection implementation from combobox"
authorBenjamin Otte <otte@redhat.com>
Mon, 16 Sep 2013 13:36:07 +0000 (15:36 +0200)
committerBenjamin Otte <otte@redhat.com>
Mon, 16 Sep 2013 13:41:15 +0000 (15:41 +0200)
This reverts commit 7cecc8e524f9ac3825622e10f8a98f5e01ac4727.

It is impossible to use the selection object of the menu while it is
collapsed (collapsed menus deselect everything for a start), so even
though the original patch was correct, the followup issues are too big
to solve this quickly to a release.

https://bugzilla.gnome.org/show_bug.cgi?id=707786

gtk/a11y/gtkcomboboxaccessible.c
testsuite/a11y/combos.txt
testsuite/a11y/pickers.txt

index e271f8e3683e77e1e5ef448c8348b370afb8d312..1c6b294ab2af0f4cc9fd6d18cf2713e384cacf38 100644 (file)
@@ -29,10 +29,12 @@ struct _GtkComboBoxAccessiblePrivate
 };
 
 static void atk_action_interface_init    (AtkActionIface    *iface);
+static void atk_selection_interface_init (AtkSelectionIface *iface);
 
 G_DEFINE_TYPE_WITH_CODE (GtkComboBoxAccessible, gtk_combo_box_accessible, GTK_TYPE_CONTAINER_ACCESSIBLE,
                          G_ADD_PRIVATE (GtkComboBoxAccessible)
-                         G_IMPLEMENT_INTERFACE (ATK_TYPE_ACTION, atk_action_interface_init))
+                         G_IMPLEMENT_INTERFACE (ATK_TYPE_ACTION, atk_action_interface_init)
+                         G_IMPLEMENT_INTERFACE (ATK_TYPE_SELECTION, atk_selection_interface_init))
 
 static void
 changed_cb (GtkWidget *widget)
@@ -51,6 +53,7 @@ changed_cb (GtkWidget *widget)
     {
       accessible->priv->old_selection = index;
       g_object_notify (G_OBJECT (obj), "accessible-name");
+      g_signal_emit_by_name (obj, "selection-changed");
     }
 }
 
@@ -327,3 +330,106 @@ atk_action_interface_init (AtkActionIface *iface)
   iface->get_localized_name = gtk_combo_box_accessible_action_get_localized_name;
   iface->get_description = gtk_combo_box_accessible_action_get_description;
 }
+
+static gboolean
+gtk_combo_box_accessible_add_selection (AtkSelection *selection,
+                                        gint          i)
+{
+  GtkWidget *widget;
+
+  widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (selection));
+  if (widget == NULL)
+    return FALSE;
+
+  gtk_combo_box_set_active (GTK_COMBO_BOX (widget), i);
+
+  return TRUE;
+}
+
+static gboolean
+gtk_combo_box_accessible_clear_selection (AtkSelection *selection)
+{
+  GtkWidget *widget;
+
+  widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (selection));
+  if (widget == NULL)
+    return FALSE;
+
+  gtk_combo_box_set_active (GTK_COMBO_BOX (widget), -1);
+
+  return TRUE;
+}
+
+static AtkObject *
+gtk_combo_box_accessible_ref_selection (AtkSelection *selection,
+                                        gint          i)
+{
+  GtkComboBox *combo_box;
+  GtkWidget *widget;
+  AtkObject *obj;
+  gint index;
+
+  widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (selection));
+  if (widget == NULL)
+    return NULL;
+
+  if (i != 0)
+    return NULL;
+
+  combo_box = GTK_COMBO_BOX (widget);
+
+  obj = gtk_combo_box_get_popup_accessible (combo_box);
+  index = gtk_combo_box_get_active (combo_box);
+
+  return atk_object_ref_accessible_child (obj, index);
+}
+
+static gint
+gtk_combo_box_accessible_get_selection_count (AtkSelection *selection)
+{
+  GtkWidget *widget;
+
+  widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (selection));
+  if (widget == NULL)
+    return 0;
+
+  return (gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) == -1) ? 0 : 1;
+}
+
+static gboolean
+gtk_combo_box_accessible_is_child_selected (AtkSelection *selection,
+                                            gint          i)
+{
+  GtkWidget *widget;
+  gint j;
+
+  widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (selection));
+
+  if (widget == NULL)
+    return FALSE;
+
+  j = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
+
+  return (j == i);
+}
+
+static gboolean
+gtk_combo_box_accessible_remove_selection (AtkSelection *selection,
+                                           gint          i)
+{
+  if (atk_selection_is_child_selected (selection, i))
+    atk_selection_clear_selection (selection);
+
+  return TRUE;
+}
+
+static void
+atk_selection_interface_init (AtkSelectionIface *iface)
+{
+  iface->add_selection = gtk_combo_box_accessible_add_selection;
+  iface->clear_selection = gtk_combo_box_accessible_clear_selection;
+  iface->ref_selection = gtk_combo_box_accessible_ref_selection;
+  iface->get_selection_count = gtk_combo_box_accessible_get_selection_count;
+  iface->is_child_selected = gtk_combo_box_accessible_is_child_selected;
+  iface->remove_selection = gtk_combo_box_accessible_remove_selection;
+}
index 7bcd8e044af495bf38c9811f6423ce6443140b8a..e450993e07f74d5b28e14f84cd539a82e11942be 100644 (file)
@@ -69,6 +69,7 @@ window1
       action 0 name: press
       action 0 description: Presses the combobox
       action 0 keybinding: <Alt>c
+      <AtkSelection>
       unnamed-GtkMenuAccessible-0
         "menu"
         parent: combo1
@@ -91,6 +92,7 @@ window1
       <AtkAction>
       action 0 name: press
       action 0 description: Presses the combobox
+      <AtkSelection>
       unnamed-GtkMenuAccessible-1
         "menu"
         parent: combo2
@@ -154,6 +156,7 @@ window1
       <AtkAction>
       action 0 name: press
       action 0 description: Presses the combobox
+      <AtkSelection>
       unnamed-GtkMenuAccessible-2
         "menu"
         parent: combo3
@@ -176,6 +179,7 @@ window1
       <AtkAction>
       action 0 name: press
       action 0 description: Presses the combobox
+      <AtkSelection>
       unnamed-GtkMenuAccessible-3
         "menu"
         parent: combo4
index 237b1fcaa2676715f41a330aeb0482efd2a7adf5..387b18f02ebb982b6db00b0f8e2ecec74320e911 100644 (file)
@@ -58,6 +58,7 @@ window1
       <AtkAction>
       action 0 name: press
       action 0 description: Presses the combobox
+      <AtkSelection>
       unnamed-GtkMenuAccessible-0
         "menu"
         parent: button1